const express = require("express");
const cors = require("cors");
const joi = require("joi");
const jwt = require("express-jwt");
const config = require("./config");
const userRouter = require("./router/user");
const userinfoRuter = require("./router/userinfo");

const expressJwt = jwt.expressjwt || jwt.default || jwt;

// 2. 创建应用对象
const app = express();

// 3. 中间件配置
// 3.1配置cors跨域
app.use(cors());
// 3.2配置body解析中间件
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
// 3.3 配置解析token的中间件
app.use(
  expressJwt({ secret: config.jwtSecretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/api\//],
  })
);

// 3.4 响应数据的中间件

// app.use(function(req, res, next) {
//   res.setHeader('Content-Type', 'application/jsoncharset=utf-8')
//   next()
// })

app.use(function (req, res, next) {
  // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
  res.cc = function (err, status = 1) {
    res.json({
      status,
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});

// 导入并注册用户路由模块
app.use("/api", userRouter);
app.use("/my", userinfoRuter);

// if (!res.headersSent) {
//     res.setHeader('Content-Type', 'application/json')
// }

// 配置一个异常捕捉的中间件
app.use(function (err, req, res, next) {
  // 将服务器错误信息响应给客户端
  if (err instanceof joi.ValidationError) {
    return res.json({ status: 1, message: err.message });
  }
  if (err.name === "UnauthorizedError") {
    return res.json({ status: 1, message: "无效的token" });
  }
  // 未知错误
  res.json({ status: 1, message: err.message });
});

app.listen(8000, () => {
  console.log("express server running at http://127.0.0.1:8000");
});
